package main

import (
	"fmt"
	"reflect"
)

func main() {
	//var x float64 = 3.14
	//t := reflect.ValueOf(x)
	//t.SetFloat(7.14)
	//fmt.Println(t)
	/*
		这段代码有两个错误：
		（1）这段代码是想要修改 x 的值，所以 reflect.ValueOf() 函数的参数应该传入一个 指针类型，
		因为函数的参数是值拷贝，仅仅传入变量的值类型，是无法修改变量的
		（2）通过 reflect.ValueOf() 获得的 reflect.value 都是不可取地址的类型，不可取地址，也就不能进行值的修改，
		应该使用 reflect.ValueOf(&x).Elem() 来获取一个 可取地址的 reflect.Value，这样就可以修改变量的值了。
	*/
	var x float64 = 3.14
	t := reflect.ValueOf(&x).Elem()
	t.SetFloat(7.14)
	fmt.Println(t, x) //7.14 7.14

	/*
		除了 Set 方法之外，还可以使用下面的方法对变量的值进行修改
	*/
	px := t.Addr().Interface().(*float64)
	*px = 9.14
	fmt.Println(t, x) //9.14 9.14

}
